#ifndef __BoardData_C
#define __BoardData_C

#include "BoardData.h"

/////////////////////////////////////////////////////////// 充电桩编号  ///////////////////////////////////////////////////////
uint8_t  Chgr_Name[8] = "12345678";          //充电桩编号

/////////////////////////////////////////////////////////// KEY控制参数  //////////////////////////////////////////////////////
#if Key1 > 0
key_param key1_param;
int8_t key1_level = key1InitLevel;
#endif
/////////// END：KEY控制参数  ////////////

//////////////////////////////////////////////////////////// 漏电参数  /////////////////////////////////////////////////////////
struct Leakage_Ctrl  leakData;


/////////// END：漏电参数  ///////////////

//////////////////////////////////////////////////////////// PE检测参数  ////////////////////////////////////////////////////////
uint8_t  PE_EN      = 1;  // PE接地保护的功能开关
uint8_t  PE_state   = 0;  // 0 = 没有接地;
uint64_t PE_occ_recode = 0; //初次检测到，接地的时间;
#if PE_method == PE_method_ADC 
uint16_t  PE_VoltRest   = 0;
#endif
// 接地次数统计：
//uint8_t  PE_occ_times   = 0;
//uint8_t  PE_occ_tm_pre  = 0;


///////////// END：PE检测参数  /////////////

/////////// 车载二极管检测参数  ////////////
#if CarD1_Protect > 0
struct CarD1_param  CarD1Param;
#endif

/////////// END：车载二极管检测参数  ////////////

/////////// Led闪灯控制参数  ////////////
// 开机效果时间控制：
uint64_t led_startUp_TmRecode = 0;
// 闪灯控制: 默认全灭; 灯控制位：
uint16_t   Led_bits      = 0;  //闪灯on对应的灯位
uint16_t   LedOff_bits   = 0;  //闪灯off对应的灯位

// 闪灯次数标记：
uint8_t  iLed = 0;
// 闪灯控制参数：0 = 闪灯模式1，时间间隔;1000 = 闪灯时间2的间隔。
uint16_t  ledBlinkIntv[2] = {0,1000};
// 闪灯模式1;次数。7 = 7次快闪，1次慢闪。
uint8_t   ledBlinkTms = 7;
// 闪灯模式1，占空比。亮/周期
uint8_t   ledBlinkDuty  = 50;
// 闪灯时间记录
uint64_t ledBlink_TmRecode = 0;

// 正在使用灯的方案；
uint8_t   ledUsingStyle = 0;

// B20带显示屏面板的灯;
#ifdef Using_LedCtrl_74HC595
uint8_t   Led595_bits      = 0;  
uint8_t   LedOff595_bits   = 0xff;  

#endif

////////////////////////////////////////////////////////////// ADC采样相关 //////////////////////////////////////////////////////
uint16_t  ADC_read_times = 0;
ADC_BUF  ADC_Buffer; //ADC-DMA缓存
//ADC_BUF  ADC_Buffer_OK; // 转换好的数据
uint16_t  UI_Value[UI_Datas_Len][2]; //UI数据集，用于计算统计数据，或最大值。
//uint64_t  UI_Value_time[UI_Datas_Len];
// 计算功率因子用到
uint8_t   U_idx    = 0;   // 交流曲线中，电压最大值对应的数组下标
uint8_t   I_idx    = 0;   // 交流曲线中，电流最大值对应的数组下标
#if UI_Meter_Method == Meter_GuageIC_RN8302B || UI_Meter_Method == Meter_GuageIC_RN8209 
  // 读取寄存器值的缓存
  uint32_t readDataTmp = 0;			
#endif
// 电压电流相关的原始数据
UI_PARAM  uiValues;
#if meter485_ON > 0
UI_PARAM  uiValues2;
#endif
// 有效值数据
UI_Meter    UI_Data;

//温度对应的原始数据
uint16_t  TMP_BoardIn_R = 0;
uint16_t  TMP_Ext1_R    = 0;
uint16_t  TMP_Ext2_R    = 0;
// 温度数据
float  TMP_BoardIn      = 0;
float  TMP_IC           = 0;
float  TMP_Ext1         = 0;
float  TMP_Ext2         = 0;
// 滤波值
uint16_t TMP_show_lb    = 0; //滤波值
uint16_t TMP_show_int   = 0; //float转int的临时保存变量
// ADC采样频率调控：
#if RlyPin_Ctrl_PWM_EN > 0 && (defined SQDri_WS018B || defined SQDri_WS018)
uint8_t  adc_adjust     = 0;
#endif

///////////////////////////////////////////////////////////////// 开始充电数据 //////////////////////////////////////////////
// 记录充电时间;只有拔枪后才能重置时间。
uint64_t  chg_start_tm   = 0;   // 开始充电的时间:拔枪算一个充电过程。
uint64_t  Relay_Chg_tm   = 0;  // 继电器状态变更的时间;
uint8_t   Rly_status     = 0;   // 继电器状态;
uint8_t   chg_stage      = 0;   // 充电阶段;
uint16_t  relay_duty     = 0;   // 充电继电器占空比数据;
#if Non_Plug_And_Charge > 0 || PlugCharge_And_Resv
// 开启充电控制：0 = 不能开启; > 0 具备开启充电。
// 1 = 自锁按键启动充电; 2 = 非自锁按键启动充电; 3 = 刷卡充电; 4 = APP 通过蓝牙指令充电;
// 5 = 指纹充电;  6 = 刷脸充电; 
Chg_External_Reason   startChgExternalReason;
uint16_t  externalIntv    = 0;  // 外部信号，连续时间间隔。防止连续触发。
#endif

#if Has_RlyPin_Maintaining > 0
uint8_t Rly_startup_status  = 0;
#endif

/////////////////////////////////////////////////////////////// CP 控制相关 /////////////////////////////////////////////////////
#if CP_Mode == CP_Mode_sta
uint16_t CP_Datas[CP_Datas_Len];
#endif
struct CP cp_data;
struct PWM_Param PWM_Data;
#if CP_CarD1_Trigger_Mode == CP_CarD1_Trigger_TMRDelay	
uint8_t CP_CarD1_TmrBusy = 0;  //CP和二极管检测延时定时器忙;
#endif
_Bool CP_idChg = 0; 
_Bool CP_9_12_Chg = 0; 
//////////////////////////////// 充电额定数据：额定充电电流 /////////////////////////////////
uint8_t I_rated_idx                       = 0;  // 被选中的充电额定电流编号;  
#if I_rated_count >  1
uint32_t I_rated_List[I_rated_count]      = I_rated_Arr;
#if meter485_ON > 0
uint32_t I_rated_List2[I_rated_count]      = I_rated_Arr2;
#endif
float I_rated_Listf[I_rated_count]        = I_rated_Arrf;   
uint16_t DUTY_CYCLE_List[I_rated_count]   = DUTY_CYCLE_Arr; 
#endif

//////////////////////////////////  CC 检测相关  ////////////////////////////////////////////
#if CC_Detect_type > 0
uint8_t PlugIn_CC = 0;   //插枪标志变量; 0 = 未插枪；1 = 已插枪。
#endif

//////////////  继电器粘连检测电路  ///////////
#if RlyAdh_Detect_type > 0
uint8_t rly_adhsn = 0;   //继电器粘连标志变量; 0 = 未粘连；1 = 粘连。
uint64_t  rlyAdh_ToZero_tm   = 0;
#endif

//////////////////////////////////// 过流短路控制 ////////////////////////////////////////////
struct  I_Ctrl_Flag I_State_Flag;
struct  I_Ctrl      I_CtrData;
// 短路电流记录：
float ISrt_value  = 0;

//////////////////////////////////// 过压欠压控制 /////////////////////////////////////////////
struct  U_Ctrl      U_CtrData;


//////////////////////////////////// 温度控制相关 /////////////////////////////////////////////
struct  Tmpr_Ctrl  tmpr_CtrData;


//////////////////////////////////// 预约充电相关 /////////////////////////////////////////////
#if RESV_CHG_ON  > 0 || PlugCharge_And_Resv
ResvCtrl  resv_data;  // = {0,0,0,{2,3,4,0},1}; 
#endif

//////////////////////////////////// 任务相关 /////////////////////////////////////////////////
//系统时间,初始值 = 0; system_time随时间递增。准确时间 = system_time + 
uint64_t system_time = 0; 
//时间调整，现在的时间。1740790149361，通过串口，从外部传入时间：system_time_offset。
//调整后的现在时间戳TimestampNow = plugin_time + system_time[现在读时间的RTC]。
uint64_t plugin_time = 0; //时间差：plugin_time = system_time_offset - system_time[外部传入时刻的RTC]

//任务定时器计数个数
uint16_t task_tms    = 0;             
uint16_t system_startup_times = 0; 

// > 0; 禁止充电
uint8_t chgForbid      = 0;

#if proactive_chgStop_EN > 0 || PlugCharge_And_Resv
	// 停止充电倒计时计数变量
	int16_t stopChargeTmr  = 0;
#endif

///// 自己定义的任务调度参数
uint16_t mTask_SW      = 0;       //任务开关：可控制16个任务

//主策略刷新：
uint8_t  main_update             = 0;
//插枪充电的自检任务参数：某位 = 0; 无自检。某位 = 1,则自检无误。
uint8_t  chg_selfCheck_complt    = 0;

//错误处理策略
uint32_t mTask_Fault             = 0; 
uint32_t mTask_Fault_using       = 0; 
//错误响应刷新
uint8_t  fault_update            = 0; 

// 错误码：
uint8_t  faultCode               = 0; 
uint8_t  faultCodeUsingErr       = 0; 
uint8_t  faultCodeUsingLed       = 0; 

//// 错误执行时间
#ifndef UsingFreeRTOS
// 错误恢复时间
uint64_t  fault_recover_tm       = 0; 
#endif
// 恢复期时长
uint32_t  fault_recvr_intv       = 0; 
// 恢复次数统计
uint8_t   faultRecv_counts       = 0; 
// 恢复次数限制：默认250
uint8_t   faultRecv_Limit_tms    = 250; 
// 能恢复的错误发生次数：
uint8_t   faultOcc_IOvrRecv_counts = 0;    
uint8_t   faultOcc_TmprAdj_counts  = 0;  

#if CC_Detect_type == 0
// 充电拔枪检测次数
uint8_t plug_out_times         = 0;  
// 充电插枪检测次数
uint8_t plug_in_times          = 0;  
#endif

// 系统开始
uint8_t system_started         = 0;  

volatile uint8_t UpboardUpdate   = 0;
////////// END：任务相关 ///////////////


////////////////// IIC通讯相关 ////////////////
#if Using_UART_LCD == LCD_0P42_IIC
// 设备1地址
char iicBuffer[iicBufferSize];
// OLed重置步
uint8_t oled_reset_step         = 0;
// 计时
uint16_t  oled_reset_step_tm    = 0;
uint16_t  oled_reset_step_delay = 0; 
///////// End:IIC通讯相关 //////////
///////  oled 显示屏相关 ///////////
uint8_t  dataId = 0;          // 显示帧编号;不同编号，显示不同帧画面。且是递增，自动切换。
uint8_t  OledResetTm = 0;     // 屏幕重启的时间流转。
uint64_t key_down_recode = 0; //按键改变显示时，记录上次按键时间，防止点击太快，导致显示乱码。

/////////////////////////////  4.3寸显示屏相关 //////////////////////////////////
#elif Using_UART_LCD == LCD_4P3_UART
//uint8_t lcd_show_step = 0; // 显示步骤：第一步显示什么，第二步显示什么，统一管理
//uint8_t lcdParam.lcd_page_id = 0;   // 显示页面的id
//// 显示的其他参数
//int8_t lcdParam.countdownStart[1] = {9};  // 倒计时变量
//int8_t lcdParam.timer_recoder[3]  = {0, 0, 0};  // 计时变量：时，分，秒数据
//uint8_t lcdParam.RTC_data[7]  = {0x25, 0x02, 0x11, 0x02, 0x16, 0x24, 0x19};  // RTC时间BCD码
LCD_Param  lcdParam;
#if meter485_ON > 0
UI_Meter *UI_Data_Show;               //显示数据指针
#endif
#endif

///////////////////// 过0,检测相关 ///////////////////////
#if volt_zero_crossing > 0
uint8_t volt_zero  = 0; // 0 = 非过0; 1 = 过0;
// 开启充电标志
uint8_t rly_on_mark = 0; // 0 = 未设置状态；1 = 等待开启充电。
#endif

////////////////////// 带磁铁插座 ////////////////////////
#if PinPick_RatedI > 0
uint8_t PinPick_state   =  0;
#endif

//////////////////////// 蜂鸣器 //////////////////////////
#if beep_type > 0
beep_param beep;

#endif

////////////////////  刷卡全局变量  ////////////////////////
#if card_type_sel > 0
// RC522初始化准备完毕：0 = 为准备，1 = 准备完毕。
int8_t   RC522_ready    =  0;
int8_t  card_step       =  -1;
// 是否是新卡： 0 = 无状态; 1 = 旧卡; 2 = 新卡[默认密码];
uint8_t  card_type       =  0;
// 刷卡操作：1 = 读卡;  2 = 写卡; 3 = 修改密码; 
uint8_t  card_oper_type  =  0; 
// 刷卡的卡数据缓存
uint8_t  g_ucTempbuf[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 
// 读取到当前卡卡号：
uint8_t  m1CardInfo[cardInfoSize] = {0,0,0,0,0,0}; 
// 卡操作块区地址
uint8_t  cardOper_blockId = 0; 
// 卡的金额数据：
union cardCashDataFormat cardCashData; 
// 卡的设置数据
union cardSetDataFormat cardSetsData; 
// 刷卡忙线中
int8_t  isCardBusy = 0; 
// 充电桩密码：cardPwd = 默认密码
uint8_t  card_pwd[6] = cardPwd; 

#endif

//////////////////////  通讯数据 //////////////////////////
#if (UI_Meter_Method == Meter_GuageIC_RN8209) 
uint8_t rxDataBufSPI[SPI_DATA_SIZE]   = {0x00};  
#endif


//////////////////////// 串口数据 /////////////////////////
#if using_uart1 > 0
UART_Control  uart1Ctrl;  // 串口接收数据的控制参数
#endif   
#if using_uart2 > 0 
UART_Control  uart2Ctrl;
#endif
#if using_uart3 > 0 
UART_Control  uart3Ctrl;
#endif
#if using_uart4 > 0
UART_Control  uart4Ctrl;
#endif
#if using_uart5 > 0
UART_Control  uart5Ctrl;
#endif

//////////////////////// 指纹识别 /////////////////////////
#if finger_sensor_type > 0 
finger_control  fingerCtrl;
finger_info     fingerInfo;
#endif //#if finger_sensor_type > 0


//////////////////////// 485电表 /////////////////////////
#if meter485_ON > 0 
#if PowerSupplyPhase == 1
uint8_t   rdMeter485Idx = 1;   //读取485电表数据的idx;
#endif
uint8_t   rdMeter485Cmd[9];    //读取485电表数据报文数组；
UI_Meter  mt485_Data;         //485数据保存;
uint64_t  mt485RdTm;          //记录最近收到数据时间;
#endif //#if meter485_ON > 0


//////////////////// 普通参数永久保存相关 //////////////////////
// 普通参数保存变量
union flashDataUnion writeData[Write_Data_size];


//////////////////////// BleWiFi相关 //////////////////////////
#if BleWifi_type == BleWifi_Ai_WB2
BleWiFiData  bleWiFi_Data;
uint8_t  bw_arrTmp[bw_mac_size * 2];
ChgrSnapshot chgr_snapshort;
uint8_t  srv_pwd[16] = Key_SM4_Svr;
uint8_t encryptionArr[chgrSnapshotSM4Len];
char base64Arr[chgrSnapshotBase64Len];	
#endif


//////////////////////// 日志保存相关 /////////////////////////
#if Nor_Flash > 0
uint16_t NorFlashDeviceId  = 0;
#endif
#if LOG_ON > 0
uint16_t    Log_Saved_Sum = 0;   //已经存入数据的数量; 
struct log_Item  log_temp;       //日志临时变量，接收数据，并将数据传递给writeLogData
union logDataUnion writeLogData[Logs_Data_size]; // log参数保存
#if Nor_Flash > 0 // 内存数据量大，可以保存很多页数据
	uint16_t  log_sect_read_id = 0; //最多512个扇区;
	uint16_t  log_sect_save_id = 0;	
	union logDataUnion readLogData[Logs_Data_size];
#endif
#endif

//////////////////////// 功率曲线相关 /////////////////////////
#if CURVE_ON > 0
uint16_t    Curv_Saved_Sum = 0;    //已经存入数据的数量; 
struct Curv_Item  curvTemp;       //日志临时变量，转移数据;
union curvDataUnion writeCurvData[Curv_Data_size]; // 曲线参数保存[10分钟一个点,128个点能记录20小时充电数据]
#if Nor_Flash > 0 // 内存数据量大，可以保存很多页数据
	uint16_t  curv_sect_read_id = 0; //最多512个扇区;
	uint16_t  curv_sect_save_id = 0;
	union curvDataUnion readCurvData[Curv_Data_size];
#endif

#endif // #if CURVE_ON > 0

#endif
